package com.shujia

object Demo06Func03 {

  // 如果返回值类型是函数类型，则类型的声明不能省略
  def funcXX(str: String): Int => Int = {
    def func(int: Int): Int = {
      str.toInt + int + 345
    }
    // 以函数作为返回值，注意不要加括号进行调用
    func
  }

  // funcXX的简化
  def funcXX2(str: String)(int: Int): Int = {
    str.toInt + int + 345
  }

  // 柯里化函数：将一个有N个参数的函数变成N个只有一个参数的函数
  def func2(i1: Int, i2: Int, i3: Int, i4: Int): Int = {
    i1 + i2 + i3 + i4
  }

  def func2_1(i1: Int)(i2: Int)(i3: Int)(i4: Int) = {
    i1 + i2 + i3 + i4
  }

  // 偏应用函数：将有N个参数的函数变成有N-M个参数的函数，M表示固定参数的个数
  def func2_2(i1: Int, i2: Int, i3: Int = 3, i4: Int = 4): Int = {
    i1 + i2 + i3 + i4
  }

  def main(args: Array[String]): Unit = {
    /**
     * Scala中的函数可以定义在任意位置：类中、方法中、object中
     */
    // 函数式编程之以函数作为返回值
    // 调用funcXX会返回一个函数
    val int2IntFunc: Int => Int = funcXX("100")
    // 继续调用
    println(int2IntFunc(200))

    // 简化调用
    println(funcXX("100")(200))
    println(funcXX2("100")(200))

    println(func2(1, 2, 3, 4))
    println(func2_1(1)(2)(3)(4))
    println(func2_2(1, 2, 33, 44))
    println(func2_2(1, 2))
  }

}
